﻿/**************************************************************
 *
 * 唯一标识：73c73df0-ab07-4cb3-97d9-95c6c74accc5
 * 命名空间：Microsoft.Extensions.DependencyInjection
 * 创建时间：2023/9/3 7:35:55
 * 机器名称：DESKTOP-S0D075D
 * 创建者：antho
 * 电子邮箱：fengqinhua2016@163.com
 * 描述：
 *
 **************************************************************/

using Microsoft.Extensions.DependencyInjection.Extensions;
using Sgr.BackGroundTasks;

namespace Microsoft.Extensions.DependencyInjection
{
    /// <summary>
    /// 扩展
    /// </summary>
    public static class ServiceCollectionExtensions
    {
        public const string CleanupBackgroundTaskId = "CleanupBackgroundTask";

        /// <summary>
        /// 注册无入参后台任务（仅通过 GetKeyedService&lt;IBackGroundTaskInvoker&gt;(key) 调用）
        /// </summary>
        public static IServiceCollection AddBackGroundTask<TTask>(
            this IServiceCollection services,
            string? key = null)
            where TTask : class, IBackGroundTask
        {
            // 事件类型作为 key。
            key ??= typeof(TTask).AssemblyQualifiedName!;
            services.TryAddTransient<TTask>();
            services.TryAddKeyedTransient<IBackGroundTaskInvoker>(key,
                (sp, _) => new BackGroundTaskNoArgInvoker<TTask>(sp.GetRequiredService<TTask>()));
            return services;
        }

        /// <summary>
        /// 注册有入参后台任务（仅通过 GetKeyedService&lt;IBackGroundTaskInvoker&gt;(key) 调用）
        /// </summary>
        public static IServiceCollection AddBackGroundTask<TTask, TData>(
            this IServiceCollection services,
            string? key = null)
            where TTask : class, IBackGroundTask<TData>
            where TData : class
        {
            key ??= typeof(TTask).AssemblyQualifiedName!;
            services.TryAddTransient<TTask>();
            services.TryAddKeyedTransient<IBackGroundTaskInvoker>(key,
                (sp, _) => new BackGroundTaskInvoker<TTask, TData>(sp.GetRequiredService<TTask>()));
            return services;
        }
    }
}